﻿using UnityEngine;
using UnityEngine.EventSystems;

namespace Model
{
  /// <summary>
  /// 拖动实现原理:
  /// 1. 根据鼠标移动的位置，而移动窗口。
  /// </summary>
  public class WndDrag : MonoBehaviour, IDragHandler, IPointerDownHandler
  {
    // 鼠标起点
    private Vector2 mouseLocalPointerPos;

    // 面板起点
    private Vector3 panelLocalPos;

    // canvas
    public RectTransform canvas;

    // 要拖动的窗口
    public RectTransform dragWnd;

    public void OnPointerDown(PointerEventData eventData)
    {
      // 记录面板当前位置
      panelLocalPos = dragWnd.localPosition;

      // 记录鼠标在父UI节点上的本地位置
      RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, eventData.position, eventData.pressEventCamera, out mouseLocalPointerPos);
    }

    public void OnDrag(PointerEventData eventData)
    {
      // 记录鼠标在拖动中的时，在父UI节点的位置。
      Vector2 localPoint;
      if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, eventData.position, eventData.pressEventCamera, out localPoint))
      {
        // 现在鼠标位置 - 原来的鼠标位置 = 偏移
        Vector3 offset = localPoint - mouseLocalPointerPos;

        // 窗口 = 原来窗口位置 + 偏移
        dragWnd.localPosition = panelLocalPos + offset;
      }

      ClampToWindow();
    }

    // 限制当前面板在父节点中的区域位置  
    void ClampToWindow()
    {
      // 面板位置  
      Vector3 pos = dragWnd.localPosition;

      // 如果是UI父节点，设置面板大小为0，那么最大最小位置为正负屏幕的一半。因为UGUI Canvas坐标是在中心点。
      Vector3 minPosition = canvas.rect.min - dragWnd.rect.min;
      Vector3 maxPosition = canvas.rect.max - dragWnd.rect.max;

      pos.x = Mathf.Clamp(dragWnd.localPosition.x, minPosition.x, maxPosition.x);
      pos.y = Mathf.Clamp(dragWnd.localPosition.y, minPosition.y, maxPosition.y);

      dragWnd.localPosition = pos;
    }
  }
}
